컴퓨터과학
어셈블리_10_문자열 참조와 교차 참조(X-Ref) 분석
작성자 : Heehyeon Yoo|2025-10-24
# Assembly# Ghidra# X-Ref# Strings
바이너리 분석 시 main 함수부터 순차적으로 분석하는 것은 프로그램 규모가 커질수록 비효율적이다. 대신 "명확한 단서"를 찾아 로직을 역추적하는 접근법이 유효하다. 가장 직관적이고 강력한 단서는 문자열(String)이다.
1. 문자열 검색(String Search)
프로그램은 사용자 인터페이스를 위해 반드시 문자열을 포함한다.
- "Password Incorrect"
- "Success!"
이러한 문자열은 컴파일 시 .rodata나 .data 영역에 저장된다. Ghidra의 Search -> For Strings 기능을 이용하면 바이너리 내 모든 문자열을 목록화할 수 있다.
2. 교차 참조(Cross-Reference, X-Ref)
문자열 자체보다 중요한 것은 "해당 문자열을 사용하는 코드의 위치"다.
Ghidra에서 문자열을 선택하고 XREF 정보를 확인하면, 이 데이터를 참조하는 함수와 주소를 알 수 있다.
XREF[1]: check_password:00401050 (R)
ds "Correct!"
위 정보는 "check_password 함수의 00401050 번지에서 이 문자열을 읽고 있다"는 의미다. 해당 위치로 이동하면 인증 성공 시 메시지를 출력하는 로직을 발견할 수 있다.
if (is_valid) {
puts("Correct!"); // <- X-Ref를 통해 도달한 위치
}
이 방식을 사용하면 인증 로직(if (is_valid))의 위치를 즉시 특정할 수 있다. 단, 문자열이 암호화되어 있거나 동적으로 생성되는 경우에는 API 호출 추적 등 다른 기법을 병행해야 한다.
스택 문자열 (Stack Strings)
일부 악성코드나 보호 기법은 문자열 검색을 피하기 위해, 문자열을 한 글자씩 스택에 밀어 넣어서 동적으로 생성한다.mov [rbp-0x4], 'F' mov [rbp-0x3], 'l' mov [rbp-0x2], 'a' mov [rbp-0x1], 'g'이런 경우 단순 문자열 검색(Strings)으로는 'Flag'라는 단어가 보이지 않는다. 이때는 메모리 덤프나 디컴파일 코드를 직접 확인해야 한다.